/*
设计思路
	自动检测视频宽度，但需要参数设置视频高度。每帧第一个post_valid高电平对应source_sop高电平脉冲、最后一个
post_valid高电平对应source_eop高电平脉冲。
*/
module native2ast_trans#(
parameter IMG_VDISP = 12'd480,
parameter DWIDTH    = 24
	)(
    input               clk         ,
	input               rst_n       ,
	input               pre_vsync   ,
	input               pre_href    ,
	input               pre_valid   ,
	input  [DWIDTH-1:0] pre_data    ,
	output              source_valid,
	output              source_eop  ,
	output              source_sop  ,
	output [DWIDTH-1:0] source_data  
    );
wire       href_neg;//pre_href的下降沿检测标志信号，高有效
reg [11:0] x_cnt;//列计数器
reg [11:0] y_cnt;//行计数器
reg [11:0] width;//检测到的视频宽度，通常第一行结束就得到结果
reg        href ;//对pre_href打一拍
reg        sop_r,eop_r;//帧头、尾标志，高有效
//pre_href下降沿检测
assign href_neg = !pre_href && href;//pre_href的下降沿检测标志信号，高有效
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
    href <= 1'b0    ;
else  
    href <= pre_href;//对pre_href打一拍
end
//对列进行计数
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
    x_cnt <= 12'd0    ;
else  
    x_cnt <= href_neg?12'd0:x_cnt+pre_valid;//pre_href下降沿清零，根据pre_valid高电平脉冲自增
end
//寄存width
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
    width <= 12'd0    ;
else  
    width <= href_neg?x_cnt:width;//pre_href下降沿更新数值为当前的x_cnt，否则保持不变
end
//对行进行计数
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
    y_cnt <= 12'd0    ;
else  
    y_cnt <= (!pre_vsync)?12'd0:y_cnt+href_neg;//根据href_neg高电平脉冲自增
end
//产生sop
assign source_sop = sop_r;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
    sop_r <= 1'b0    ;
else  
    sop_r <= pre_valid && !(|x_cnt) && !(|y_cnt);//按位或再取反，等价于判断是否等于0
end
//产生eop
assign source_eop = eop_r;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
    eop_r <= 1'b0    ;
else  
    eop_r <= pre_valid && (x_cnt == width-1) && (y_cnt == IMG_VDISP-1);
end
//产生source_data、source_valid
shift_regs#(
.DWIDTH(DWIDTH+1),
.DELAY_DUTY(1)
) shift_regs0(
    .clk(clk),
	.rst_n(rst_n),
	.idata({pre_data,pre_valid}),
	.odata({source_data,source_valid})
);
endmodule